"""
Case Type   : CM_Tools
Case Name   : cm_ctl build重建备机 基础参数验证
Create At   : 2025/5/21
Owner       : ningyali
Description :
    1.强制重建指定备dn
    2.全量重建指定备节点
Expect      :
    1.执行成功
    2.执行成功
History     :
"""

import os
import time
import unittest

from testcase.utils.ComInstall import CmInstall
from testcase.utils.ComInstall import CmUnInstall
from testcase.utils.Common import Common
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from testcase.utils.Logger import Logger
from yat.test import Node
from yat.test import macro


class CMServer(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'-----{os.path.basename(__file__)} start-----')
        self.pri_sh = CommonSH('PrimaryDbUser')
        self.root_nodes = (Node('PrimaryRoot'), Node('Standby1Root'),
                           Node('Standby2Root'))
        self.user_nodes = (Node('PrimaryDbUser'), Node('Standby1DbUser'),
                           Node('Standby2DbUser'))
        self.common = Common()
        self.constant = Constant()

        text = '----prestep1:安装cm;expect:执行成功----'
        self.log.info(text)
        self.install_pkg_path = os.path.dirname(macro.DB_SCRIPT_PATH)
        self.cm = CmInstall(self.install_pkg_path, self.pri_sh.node.ssh_user)
        res = self.cm.update_xml_for_cm(*self.root_nodes)
        self.assertGreater(res.count('cmDir'), 1, f'执行失败: {text}')

        res = self.cm.cm_install(self.user_nodes[0])
        self.assertIn('Install CM tool success', res, f'执行失败: {text}')

    def test_trans(self):
        text = '----step1:强制重建指定备dn;expect:执行成功----'
        self.log.info(text)
        q_cmd = f"source {macro.DB_ENV_PATH};" \
                f"cm_ctl build -n 2 -D {macro.DB_INSTANCE_PATH} -f"
        q_res = self.common.get_sh_result(self.user_nodes[0], q_cmd)
        self.assertIn(self.constant.cm_build_success_msg, q_res,
                      f'执行失败: {text}')

        text = '----step2:全量重建指定备节点;expect:执行成功----'
        self.log.info(text)
        q_cmd = f"source {macro.DB_ENV_PATH};" \
                f"cm_ctl build -n 3 -D {macro.DB_INSTANCE_PATH} -b full"
        q_res = self.common.get_sh_result(self.user_nodes[0], q_cmd)
        self.assertIn(self.constant.cm_build_success_msg, q_res,
                      f'执行失败: {text}')

    def tearDown(self):
        text = '----poststep1:还原集群;expect:执行成功----'
        self.log.info(text)
        q_cmd = f"source {macro.DB_ENV_PATH};cm_ctl query -v -C -i -d"
        q_res = self.common.get_sh_result(self.user_nodes[0], q_cmd)
        if 'Standby Normal' in q_res.splitlines()[-1].split('|')[0]:
            switch_cmd = f"source {macro.DB_ENV_PATH}; cm_ctl switchover -a;"
            self.common.get_sh_result(self.user_nodes[0], switch_cmd)
            time.sleep(5)
            q_res = self.common.get_sh_result(self.user_nodes[0], q_cmd)

        text = '----poststep2:卸载cm;expect:执行成功----'
        self.log.info(text)
        self.un_cm = CmUnInstall(self.install_pkg_path,
                                 self.pri_sh.node.ssh_user)
        res = self.un_cm.cm_uninstall(
            self.user_nodes[0], '--deleteData --deleteBinary')

        self.assertTrue(
            'Primary Normal' in q_res and q_res.count('Standby Normal') == 2,
            f'执行失败: {text}')
        self.assertIn('Uninstall CM tool success', res, f'执行失败: {text}')
        self.log.info(f'-----{os.path.basename(__file__)} end-----')
